/**
 * 用户管理服务模块
 *
 * 处理用户相关的数据操作逻辑
 */
const { User } = require("../models");

class UserService {
  //TODO:添加用户相关的数据操作方法
  static async getAllUsers() {
    //第一步：获取所有用户，从数据库中查询
    const users = await User.findAll({
      order: [
        ["updated_at", "DESC"], //数据库的字段名，而不是模型的属性名
        ["id", "ASC"],
      ],
    });
    return users;
  }

  static async getUserById(userId) {
    //第一步：获取所有用户，从数据库中查询
    // const user = await User.findOne({
    //   where: {
    //     id: userId,
    //   },
    // });

    return await User.findByPk(userId);
  }

  static async createUser(userData) {
    // 只插入允许的字段，并跳过 undefined 值
    const allowedFields = [
      'nickName',
      'avatarUrl',
      'openid',
      'active',
      'city',
      'province',
      'country',
      'gender'
    ];

    const filteredData = {};

    for (const field of allowedFields) {
      if (userData[field] !== undefined) {
        filteredData[field] = userData[field];
      }
    }

    // 特殊处理 gender ENUM 字段
    if (filteredData.gender !== undefined) {
      // 确保 gender 是有效值 ('0'=未知, '1'=男, '2'=女)
      const validGenders = ['0', '1', '2'];
      filteredData.gender = validGenders.includes(filteredData.gender) ? filteredData.gender : '0';
    }

    //第一步：创建用户，向数据库中插入数据
    //创建用户
    return await User.create(filteredData);
  }

  static async getUserByOpenid(openid) {
    return await User.findOne({ where: { openid } });
  }


  static async updateUser(user) {
    // 验证用户ID是否存在
    if (!user.id) {
      throw new Error("缺少用户ID，无法更新用户");
    }

    // 构建更新数据对象
    const updateData = {};

    // 只更新允许的字段，并跳过 undefined 值
    const allowedFields = [
      'nickName',
      'avatarUrl',
      'openid',
      'active',
      'city',
      'province',
      'country'
    ];

    // 复制允许的字段
    for (const field of allowedFields) {
      if (user[field] !== undefined) {
        updateData[field] = user[field];
      }
    }

    // 特殊处理 gender ENUM 字段
    if (user.gender !== undefined) {
      // 确保 gender 是有效值 ('0'=未知, '1'=男, '2'=女)
      const validGenders = ['0', '1', '2'];
      updateData.gender = validGenders.includes(user.gender) ? user.gender : '0';
    }

    // 执行更新操作
    await User.update(updateData, { where: { id: user.id } });

    // 返回更新后的用户
    return await User.findByPk(user.id);
  }

  static async deleteUserById(id) {
    if(!id) {
      throw new Error("缺少用户ID，无法删除用户");
    }
    
    //删除用户
    await User.destroy({ where: { id } });
  }
}

module.exports = UserService;